vmx_wait_io();
}
-enum { COPY_IN = 0, COPY_OUT };
-
-static inline int
+int
vmx_copy(void *buf, unsigned long laddr, int size, int dir)
{
- char *addr;
unsigned long mfn;
+ char *addr;
+ int count;
- if ( (size + (laddr & (PAGE_SIZE - 1))) >= PAGE_SIZE )
- {
- printf("vmx_copy exceeds page boundary\n");
- return 0;
- }
+ while (size > 0) {
+ count = PAGE_SIZE - (laddr & ~PAGE_MASK);
+ if (count > size)
+ count = size;
- mfn = get_mfn_from_pfn(laddr >> PAGE_SHIFT);
- addr = (char *)map_domain_page(mfn) + (laddr & ~PAGE_MASK);
+ mfn = get_mfn_from_pfn(laddr >> PAGE_SHIFT);
+ /* XXX check whether laddr is valid */
+ addr = (char *)map_domain_page(mfn) + (laddr & ~PAGE_MASK);
- if (dir == COPY_IN)
- memcpy(buf, addr, size);
- else
- memcpy(addr, buf, size);
+ if (dir == VMX_COPY_IN)
+ memcpy(buf, addr, count);
+ else
+ memcpy(addr, buf, count);
+
+ unmap_domain_page(addr);
+
+ laddr += count;
+ buf += count;
+ size -= count;
+ }
- unmap_domain_page(addr);
return 1;
}
u32 cp;
/* make sure vmxassist exists (this is not an error) */
- if (!vmx_copy(&magic, VMXASSIST_MAGIC_OFFSET, sizeof(magic), COPY_IN))
+ if (!vmx_copy(&magic, VMXASSIST_MAGIC_OFFSET, sizeof(magic), VMX_COPY_IN))
return 0;
if (magic != VMXASSIST_MAGIC)
return 0;
*/
case VMX_ASSIST_INVOKE:
/* save the old context */
- if (!vmx_copy(&cp, VMXASSIST_OLD_CONTEXT, sizeof(cp), COPY_IN))
+ if (!vmx_copy(&cp, VMXASSIST_OLD_CONTEXT, sizeof(cp), VMX_COPY_IN))
goto error;
if (cp != 0) {
if (!vmx_world_save(d, &c))
goto error;
- if (!vmx_copy(&c, cp, sizeof(c), COPY_OUT))
+ if (!vmx_copy(&c, cp, sizeof(c), VMX_COPY_OUT))
goto error;
}
/* restore the new context, this should activate vmxassist */
- if (!vmx_copy(&cp, VMXASSIST_NEW_CONTEXT, sizeof(cp), COPY_IN))
+ if (!vmx_copy(&cp, VMXASSIST_NEW_CONTEXT, sizeof(cp), VMX_COPY_IN))
goto error;
if (cp != 0) {
- if (!vmx_copy(&c, cp, sizeof(c), COPY_IN))
+ if (!vmx_copy(&c, cp, sizeof(c), VMX_COPY_IN))
goto error;
if (!vmx_world_restore(d, &c))
goto error;
*/
case VMX_ASSIST_RESTORE:
/* save the old context */
- if (!vmx_copy(&cp, VMXASSIST_OLD_CONTEXT, sizeof(cp), COPY_IN))
+ if (!vmx_copy(&cp, VMXASSIST_OLD_CONTEXT, sizeof(cp), VMX_COPY_IN))
goto error;
if (cp != 0) {
- if (!vmx_copy(&c, cp, sizeof(c), COPY_IN))
+ if (!vmx_copy(&c, cp, sizeof(c), VMX_COPY_IN))
goto error;
if (!vmx_world_restore(d, &c))
goto error;